<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of LolimsaBO
 *
 * @author josem
 */
class ConsultaLolimsaBO {
    var $ws;
    var $className;

    public function __construct() {
        $this->className = 'ConsultaLolimsaBO';
        LogUtil::info("class $this->className", "__construct");
        $this->ws = BOFactory::getConsultaWS();
    }
    
    public function getToken(){
        try{
            $xmlstr=$this->ws->requestToken();
            $xml = new SimpleXMLElement($xmlstr);            
            if(!$xml->Error){
                $requestTokenResponse= new RequestTokenResponse();
                $requestTokenResponse->token= $xml->Token;                        
                $requestTokenResponse->expiry=$xml->Expiry;                        
                return $requestTokenResponse;
            }else{                                
                throw new Exception($xml->Error);
            }            
         }catch(Exception $e){           
           LogUtil::info("class $this->className", $e->getMessage());
           throw new Exception($e->getMessage(), $e->getCode());
       }        
    }
    
    public function getPartnerData($token,$codEstablecimiento='%',$codServicio='%',$codMedico='%',$consecutivo='1'){
        try{
            $xmlstr=$this->ws->GetPartnerData($token,$codEstablecimiento,$codServicio,$codMedico,$consecutivo);
            $msgError = $this->errorHL7($xmlstr);            
            if(!$msgError){                                       
                return $this->cargarPartnerDataResponse($xmlstr);                
            }else{                        
                $msgError=substr($msgError, 3,count($msgError)-3);                        
                throw new Exception($msgError);
            }           
         }catch(Exception $e){           
           LogUtil::info("class $this->className", $e->getMessage());
           throw new Exception($e->getMessage(), $e->getCode());
       }        
    }
    
    public function GetScheduleDetail($token,$codEstablecimiento,$codServicio,$codMedico,$fecha,$consecutivo="1"){
        try{
            $xmlstr=$this->ws->GetScheduleDetail($token,$codEstablecimiento,$codServicio,$codMedico,$fecha,$consecutivo);
            $msgError = $this->errorHL7($xmlstr);            
            if(!$msgError){                                       
                return $this->cargarScheduleDetailResponse($xmlstr);                
            }else{                        
                $msgError=substr($msgError, 3,count($msgError)-3);                        
                throw new Exception($msgError);
            }           
         }catch(Exception $e){           
           LogUtil::info("class $this->className", $e->getMessage());
           throw new Exception($e->getMessage(), $e->getCode());
       }        
    }
    
    public function AppointmentInsert($token,$segmentoSCH,$segmentoPID,$segmentoRGS,$segmentoAIS,$segmentoAIL,$segmentoAIP){
        LogUtil::info("class $this->className","AppointmentInsert");
        try{
            $xmlstr=$this->ws->AppointmentInsert($token,$segmentoSCH,$segmentoPID,$segmentoRGS,$segmentoAIS,$segmentoAIL,$segmentoAIP);
            $msgError = $this->errorHL7($xmlstr);            
            if(!$msgError){                                       
                return $this->cargarAppointmentInsertResponse($xmlstr);                
            }else{                        
                $msgError=substr($msgError, 3,count($msgError)-3);                        
                throw new Exception($msgError);
            }           
         }catch(Exception $e){           
           LogUtil::info("class $this->className", $e->getMessage());
           throw new Exception($e->getMessage(), $e->getCode());
       }        
    }
    
    private function cargarAppointmentInsertResponse($cadena){
        $appointmentInsertResponse = new AppointmentInsertResponse();        
        //$i1 = 0;   
        LogUtil::info('resp',$cadena);
        $subcadena= substr( $cadena,73);  
        //echo $subcadena;
        $arreglo = explode(Constantes::$HL7_ZMS, $subcadena);
        foreach ($arreglo as $valor) {            
            $fila = explode(Constantes::$HL7_SEPARADOR, $valor);
            //echo "--".$valor."--<br>";              
            $appointmentInsertResponse->mensaje=$fila[3];             
        }        
        return $appointmentInsertResponse;
    }
    
    private function cargarScheduleDetailResponse($cadena){
        $scheduleDetail = new ScheduleDetailResponse();        
        $i1 = 0;        
        $subcadena= substr( $cadena,73);  
        //echo $subcadena;
        $arreglo = explode(Constantes::$HL7_ZMS, $subcadena);
        foreach ($arreglo as $valor) {            
            $fila = explode(Constantes::$HL7_SEPARADOR, $valor);
            //echo "--".$valor.count($fila)."--<br>";
            
            $est=new CitaWS();
            $est->consecutivoDisponibilidad=$fila[1];
            $est->tipoDisponibilidad=$fila[2];
            $est->horario=trim($fila[3]);            
            $scheduleDetail->cita[$i1++]=$est;             
        }        
        return $scheduleDetail;
    }
    
    private function cargarPartnerDataResponse($cadena){
        $partnerDataResponse = new PartnerDataResponse();        
        $i1 = 0;
        $i2 = 0;
        $i3 = 0;
        $subcadena= substr( $cadena,82);  
        $arreglo = explode(Constantes::$HL7_ZMS, $subcadena);
        foreach ($arreglo as $valor) {            
            $fila = explode(Constantes::$HL7_SEPARADOR, $valor);
            //echo "--".$valor.count($fila)."--<br>";
            switch($fila[1]){
                case 'E':{
                    $est=new EstablecimientoWS();
                    $est->tipoRegistro=$fila[1];
                    $est->codRegistro=$fila[2];
                    $est->descripcion=$fila[3];
                    $partnerDataResponse->establecimiento[$i1++]=$est;
                }break;
                case 'S':{
                    $est=new ServicioWS();
                    $est->tipoRegistro=$fila[1];
                    $est->codRegistro=$fila[2];
                    $est->descripcion=$fila[3];
                    $est->establecimientosAsociados=$fila[4];
                    $partnerDataResponse->servicio[$i2++]=$est;
                }break;
                case 'M':{
                    $est=new MedicoWS();
                    $est->tipoRegistro=$fila[1];
                    $est->codRegistro=$fila[2];
                    $est->descripcion=$fila[3];
                    $est->establecimientosAsociados=$fila[4];
                    $est->serviciosAsociados=$fila[5];
                    $partnerDataResponse->medico[$i3++]=$est;
                }break;
            }
        }        
        return $partnerDataResponse;
    }
    
    private function errorHL7($cadena){
        $segmento =substr( $cadena,82,3);
        if (Constantes::$HL7_ERR == $segmento){
            return substr( $cadena,89);            
        }
    }
}

?>
